001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-9-12
005 * Time: 13:58:40
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util;
010
011 import EVolve.visualization.*;
012 import EVolve.Scene;
013 import javax.swing.*;
014 import javax.swing.event.InternalFrameAdapter;
015 import javax.swing.event.InternalFrameEvent;
016 import java.awt.geom.Point2D;
017 import java.awt.image.BufferedImage;
018 import java.awt.*;
019
020
021 public class Magnifier implements Cloneable{
022 private JInternalFrame window;
023 private JDesktopPane desktop;
024 private AxesPanel magnifiedPanel;
025 private Point2D.Double mousePosition;
026 private Rectangle imageBounds;
027 private boolean flipImage;
028
029 public Magnifier(boolean flipImage) {
030 window = null;
031 desktop = Scene.getUIManager().getDesktop();
032 mousePosition = new Point2D.Double(-1,-1);
033 this.flipImage = flipImage;
034 }
035
036 private void createWindow() {
037 if (window == null) {
038 window = new JInternalFrame("Zoomed View");
039 window.addInternalFrameListener(new InternalFrameAdapter() {
040 public void internalFrameClosing(InternalFrameEvent e) {
041 window = null;
042 }
043 });
044 /*window.addInternalFrameListener(new InternalFrameAdapter() {
045 public void internalFrameDeactivated(InternalFrameEvent e) {
046 cleanup();
047 }
048 });*/
049 window.setClosable(true);
050 int flag = AxesPanel.Pointer_Enabled | AxesPanel.Scale_Image;
051 if (flipImage)
052 flag = flag | AxesPanel.Flip_Image;
053 magnifiedPanel = new AxesPanel(flag);
054 window.setBounds(desktop.getSize().width - 400, 0, 300, 300);
055 window.setResizable(true);
056 window.getContentPane().add(magnifiedPanel);
057 desktop.add(window);
058 mousePosition.setLocation(magnifiedPanel.getWidth()/2,magnifiedPanel.getHeight()/2);
059 }
060 window.moveToFront();
061 window.setVisible(true);
062 }
063
064 public void showWindow(BufferedImage subImage) {
065 createWindow();
066
067 int w = magnifiedPanel.getWidth();
068 int h = magnifiedPanel.getHeight();
069 if ((w*h != 0)&&(subImage!=null)) {
070 imageBounds = new Rectangle(0,0,subImage.getWidth(),subImage.getHeight());
071
072 magnifiedPanel.setImage(subImage);
073 magnifiedPanel.setPointerPosition((int)Math.round(mousePosition.x), (int)Math.round(mousePosition.y));
074 magnifiedPanel.repaint();
075 if (!window.isVisible()) {
076 try {
077 window.show();
078 window.setVisible(true);
079 } catch (Exception e) {}
080 }
081 }
082 }
083
084 public void convertMousePosition(AxesPanel zoomed) {
085 if ((magnifiedPanel == null) || (magnifiedPanel.getWidth() == 0)) {
086 return;
087 }
088 int w = magnifiedPanel.getWidth(), h = magnifiedPanel.getHeight();
089
090
091 Point2D.Double mousePos = zoomed.getMouseMovement();
092 //double pixel_x_size = (double)zoomed.getWidth()/imageBounds.getWidth();
093 //double pixel_y_size = (double)zoomed.getHeight()/imageBounds.getHeight();
094
095 int guessX = 0, guessY = 0;
096 while (guessX<w) {
097 if (magnifiedPanel.getImageX(guessX) == mousePos.x) break;
098 guessX++;
099 }
100 while (guessY<h){
101 if (magnifiedPanel.getImageY(guessY) == mousePos.y) break;
102 guessY++;
103 }
104
105 mousePosition.setLocation(guessX+3,guessY+3);
106 }
107
108 public void cleanup() {
109 try {
110 window.dispose();
111 window.setVisible(false);
112 window = null;
113 } catch (Exception e) {}
114 }
115
116 public Object clone() {
117 Magnifier o = null;
118 try {
119 o = (Magnifier)super.clone();
120 } catch (CloneNotSupportedException e) {
121 e.printStackTrace();
122 return null;
123 }
124 o.magnifiedPanel = (AxesPanel)magnifiedPanel.clone();
125 return o;
126 }
127 }